5. 값을 참조로 바꾸기
- 데이터를 갱신할 때, 하나라도 놓치면 데이터의 일관성이 깨질 때
(주의) A 객체의 수정으로 인한 사이드이펙트를 주의하자.
예시
고객 주문 데이터를 갱신할 때 해당 고객에 속한 주문 데이터들에 수정사항을 한번에 반영할 경우
절차
- 레코드의 유효범위가 제한적이라면 필드에 접근하는 모든 코드를 수정한 후 테스트를 한다. 이후 단계는 필요없다.
- 레코드가 캡슐화되지 않았다면 캡슐화
- 캡슐화된 객체안의 private 필드명을 변경하고, 그에 맞게 매서드 수정
- 테스트
- 생성자의 매개변수 중 필드와 이름이 겹치는 게 있다면 함수 선언 바꾸기로 변경한다.
- 접근자등의 이름도 바꿔준다.
예시 코드
😞 Before
class Order {
constructor(data) {
this._number = data.number
this._customer = new Costomer(data.customerId)
}
get customer() {
return this._customer
}
}
class Costomer {
constructor(id) {
this._id = id
}
get id() {
return this._id
}
}
😃 After
class Order {
constructor(data) {
this._number = data.number
this._customer = registerCustomer(data.customerId)
}
get customer() {
return this._customer
}
}
class Customer {
constructor(id) {
this._id = id
}
get id() {
return this._id
}
}
// 저장소 객체
let _repositoryData
export const initialize = () => {
_repositoryData = {}
_repositoryData.customer = new Map()
}
export const findCustomer = (id) => {
return _repositoryData.customer.get(id)
}
export const registerCustomer = (id) => {
if (!_repositoryData.customer.has(id)) {
_repositoryData.customer.set(id, new Customer(id))
}
return findCustomer(id)
}